<?php
/**
* 名称：新闻资讯模型类。
* 描述：新闻资讯模块业务逻辑的相关程式。
*/
final class Model_News extends Model{
    /**
    * 描述：《热点新闻》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataForHot(){
        $data=self::$Database->GetAll(
            'SELECT * FROM '.self::$Database->Table('news').' ORDER BY clickCount DESC,id DESC LIMIT 0,10'
        );
        //~
        return array(
            'Name'=>'热点排行',
            'Link'=>Route::MakeHyperlink(':news::listview',array('type'=>'hot')),
            'Rows'=>self::FormatForNews($data)
        );
    }

    /**
    * 描述：《政策法规》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0002(){
        return self::ReturnStructuralData1(45);
    }

    /**
    * 描述：《综合》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0003(){
        return self::ReturnStructuralData2(46);
    }

    /**
    * 描述：《船舶》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0004(){
        return self::ReturnStructuralData2(15);
    }

    /**
    * 描述：《集装箱》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0005(){
        return self::ReturnStructuralData2(14);
    }

    /**
    * 描述：《冶金》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0006(){
        return self::ReturnStructuralData2(12);
    }

    /**
    * 描述：《钢铁》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0007(){
        return self::ReturnStructuralData2(13);
    }

    /**
    * 描述：《煤炭》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0008(){
        return self::ReturnStructuralData2(11);
    }

    /**
    * 描述：《化工》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0009(){
        return self::ReturnStructuralData2(10);
    }

    /**
    * 描述：《石油》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0010(){
        return self::ReturnStructuralData2(9);
    }

    /**
    * 描述：《民生》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0011(){
        return self::ReturnStructuralData2(8);
    }

    /**
    * 描述：《期货》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0012(){
        return self::ReturnStructuralData2(7);
    }

    /**
    * 描述：《国内》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0013(){
        return self::ReturnStructuralData2(4);
    }

    /**
    * 描述：《国际》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0014(){
        return self::ReturnStructuralData2(6);
    }

    /**
    * 描述：《产业经济之子类别》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0015(){
        return self::FormatForClass(Model_Common_Sort::GetSubclassData('news_class',2));
    }

    /**
    * 描述：《宏观之子类别》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0016(){
        return self::FormatForClass(Model_Common_Sort::GetSubclassData('news_class',1));
    }

    /**
    * 描述：《头条》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0017(){
        $rows=self::$Database->GetAll(
            'SELECT * FROM '.self::$Database->Table('news_headline').' ORDER BY id DESC LIMIT 0,2'
        );
        //~
        $data=array('Name'=>'头条','Data'=>$rows
        );
        //
        return $data;
    }

    /**
    * 描述：《要闻》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0018(){
        $rows=self::$Database->GetAll(
            'SELECT * FROM '.self::$Database->Table('news_highlights').' ORDER BY id DESC LIMIT 0,10'
        );
        //~
        $data=array(
            'Name'=>'要闻',
            'Data'=>$rows
        );
        return $data;
    }

    /**
    * 描述：《大宗资讯》数据。
    * @static
    * @access public
    * @return array
    */
    public static function GetDataX0019(){
        $data=self::ReturnStructuralData1(3);
        //~
        if(count($data['Rows'])>2){
            $newData=array(
                'top'=>array_slice($data['Rows'],0,2),
                'common'=>array_slice($data['Rows'],2,count($data['Rows']))
            );
        }
        else{
            $newData=array(
                'top'=>$data['Rows'],
                'common'=>NULL
            );
        }
        $data['Rows']=$newData;
        //~
        return $data;
    }

    /**
    * 描述：返回结构化数据之类型1。
    * @static
    * @access protected
    * @return array
    */
    protected static function ReturnStructuralData1($class){
        return array(
            'Name'=>self::$Database->GetOne('SELECT name FROM '.self::$Database->Table('news_class').' WHERE id='.$class),
            'Link'=>Route::MakeHyperlink(':news::listview',array('class'=>$class)),
            'Rows'=>self::GetRowsByClass($class,10)
        );
    }

    /**
    * 描述：返回结构化数据之类型2。
    * @static
    * @access protected
    * @return array
    */
    protected static function ReturnStructuralData2($class){
        $scalar=array(
            'classes'=>array($class)
        );
        //~
        $data['class']=self::FormatForClass(self::$Database->GetAll(
            'SELECT id,name FROM '.self::$Database->Table('news_class').' WHERE parent='.$class
        ));
        foreach($data['class'] as $row){
            $scalar['classes'][]=$row['id'];
        }
        $data['news']=self::GetRowsByClass($scalar['classes'],8);
        $purifier=new HTMLPurifier(HTMLPurifier_Config::createDefault());
        $data['news'][0]['summary']=$purifier->purify($data['news'][0]['content']);
        //~
        $struct=array(
            'news'=>array('top'=>$data['news']),
            'class'=>array('show'=>$data['class'])
        );
        if(!empty($data['news'])&&count($data['news'])>0){
            $struct['news']=array(
                'top'=>$data['news'][0],
                'common'=>array_slice($data['news'],1,count($data['news'])),
            );
        }
        if(!empty($data['class'])&&count($data['class'])>4){
            $struct['class']=array(
                'show'=>array_slice($data['class'],0,4),
                'hide'=>array_slice($data['class'],4,count($data['class'])),
            );
        }
        //~
        return array(
            'Name'=>self::$Database->GetOne('SELECT name FROM '.self::$Database->Table('news_class').' WHERE id='.$class),
            'Link'=>Route::MakeHyperlink(':news::listview',array('class'=>$class)),
            'Rows'=>$struct
        );
    }

    private static function FormatForNews($data){
        foreach($data as &$row){
            $row['link']=Route::MakeHyperlink(':news::detail',array('id'=>$row['id']));
            $row['cover']=BUILD_PATH.'/data/000/news/'.$row['cover'];
        }
        return $data;
    }

    private static function FormatForClass($data){
        foreach($data as &$row){
            $row['link']=Route::MakeHyperlink(':news::listview',array('class'=>$row['id']));
        }
        return $data;
    }

    private static function GetRowsByClass($class,$count=10){
        $table=self::$Database->Table('news');
        //~
        if(gettype($class)==='array'){
            $sql='SELECT * FROM '.$table.' WHERE class in('.implode(',',$class).')';
        }
        else{
            $sql='SELECT * FROM '.$table.' WHERE class='.$class;
        }
        //~
        $data=self::$Database->GetAll(
            $sql.' ORDER BY istop DESC,datetime DESC LIMIT 0,'.$count
        );
        //~
        return self::FormatForNews($data);
    }
}